//
// Created by 32827 on 2024/1/17.
//
#include "yzf_gpio.h"
YZF_RESULT yzf_gpio_open_clock(YZF_GPIO_POINTER gpio){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA_EN=(uint16_t )0xFFFF;
            *(uint32_t *)HR_CLK_GATE_EN |= (uint32_t) (1UL << 11);
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA_EN=(uint32_t )0xFFFFFFFF;
            *(uint32_t *)HR_CLK_GATE_EN |= (uint32_t) (1UL << 11);
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_close_clock(YZF_GPIO_POINTER gpio){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA_EN=(uint16_t )0x0;
            *(uint32_t *)HR_CLK_GATE_EN &= ~(uint32_t) (1UL << 11);
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA_EN=(uint32_t )0x0;
            *(uint32_t *)HR_CLK_GATE_EN &= ~(uint32_t) (1UL << 11);
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_PP(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA_DIR |=(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLDOWN_EN &= ~(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLUP_EN |= (uint16_t )pin;
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA_DIR |=(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLDOWN_EN &= ~(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLUP_EN |= (uint32_t )pin;
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_OD(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA_DIR |=(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLDOWN_EN &= ~(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLUP_EN |= (uint16_t )pin;
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA_DIR |=(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLDOWN_EN &= ~(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLUP_EN |= (uint32_t )pin;
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_AFPP(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA_DIR |=(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLDOWN_EN &= ~(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLUP_EN |= (uint16_t )pin;
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA_DIR |=(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLDOWN_EN &= ~(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLUP_EN |= (uint32_t )pin;
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_AFOD(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA_DIR |=(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLDOWN_EN &= ~(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLUP_EN |= (uint16_t )pin;
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA_DIR |=(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLDOWN_EN &= ~(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLUP_EN |= (uint32_t )pin;
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_IN_FLOAT(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA_DIR &= ~(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLDOWN_EN &= ~(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLUP_EN |= (uint16_t )pin;
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA_DIR &= ~(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLDOWN_EN &= ~(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLUP_EN |= (uint32_t )pin;
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_IN_PULL_UP(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
        switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA_DIR &= ~(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLDOWN_EN &= ~(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLUP_EN &= ~(uint16_t )pin;
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA_DIR &= ~(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLDOWN_EN &= ~(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLUP_EN &= ~(uint32_t )pin;
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_IN_PULL_DOWN(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA_DIR &= ~(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLDOWN_EN |= (uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLUP_EN |= (uint16_t )pin;
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA_DIR &= ~(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLDOWN_EN |= (uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLUP_EN |= (uint32_t )pin;
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_OUT_PULL_UP(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA_DIR |=(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLDOWN_EN &= ~(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLUP_EN &= ~(uint16_t )pin;
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA_DIR |=(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLDOWN_EN &= ~(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLUP_EN &= ~(uint32_t )pin;
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_OUT_PULL_DOWN(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA_DIR |=(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLDOWN_EN |= (uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLUP_EN |= (uint16_t )pin;
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA_DIR |=(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLDOWN_EN |= (uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLUP_EN |= (uint32_t )pin;
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_IN_ANALOG(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA_DIR &= ~(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLDOWN_EN &= ~(uint16_t )pin;
            *(uint16_t *)HR_GPIOA_PULLUP_EN |= (uint16_t )pin;
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA_DIR &= ~(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLDOWN_EN &= ~(uint32_t )pin;
            *(uint32_t *)HR_GPIOB_PULLUP_EN |= (uint32_t )pin;
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
//废弃
YZF_RESULT yzf_gpio_set_MIDDLE(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_LOW(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_HIGH(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    return YZF_OK;
}

YZF_RESULT yzf_gpio_set_0(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA &= ~(uint16_t )pin;
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA &= ~(uint32_t )pin;
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_BOOL yzf_gpio_get(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            return (*(uint16_t *)HR_GPIOA_DATA&(uint16_t)pin)!=0?YZF_TRUE:YZF_FALSE;
        case HR_GPIOB_BASE_ADDR:
            return (*(uint32_t *)HR_GPIOB_DATA&(uint32_t)pin)!=0?YZF_TRUE:YZF_FALSE;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_1(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA |= (uint16_t )pin;
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA |= (uint32_t )pin;
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set0(YZF_GPIO_POINTER gpio,uint16_t pin){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA &= ~(uint16_t )pin;
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA &= ~(uint32_t )pin;
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set1(YZF_GPIO_POINTER gpio,uint16_t pin){
    switch (gpio) {
        case HR_GPIOA_BASE_ADDR:
            *(uint16_t *)HR_GPIOA_DATA |= (uint16_t )pin;
            break;
        case HR_GPIOB_BASE_ADDR:
            *(uint32_t *)HR_GPIOB_DATA |= (uint32_t )pin;
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_lock(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    return YZF_OK;
}
YZF_RESULT yzf_gpio_unlock(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    return YZF_OK;
}

YZF_GPIO_POINTER  mGpio= (YZF_GPIO_POINTER) YZF_NULL;
YZF_GPIO_PIN  mPin=YZF_NULL;
YZF_RESULT yzf_gpio(YZF_GPIO_POINTER gpio){
    mGpio=gpio;
    return YZF_OK;
}
YZF_RESULT yzf_gpio_pin(YZF_GPIO_PIN pin){
    mPin=pin;
    return YZF_OK;
}
YZF_RESULT yzf_gpio_open_clock_(){
    YZF_CHECK_PARAM(mGpio)
    return yzf_gpio_open_clock(mGpio);
}
YZF_RESULT yzf_gpio_close_clock_(){
    YZF_CHECK_PARAM(mGpio)
    return yzf_gpio_close_clock(mGpio);
}
YZF_RESULT yzf_gpio_set_PP_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_PP(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_OD_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_OD(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_AFPP_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_AFPP(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_AFOD_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_AFOD(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_IN_FLOAT_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_IN_FLOAT(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_IN_PULL_UP_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_IN_PULL_UP(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_IN_PULL_DOWN_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_IN_PULL_DOWN(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_OUT_PULL_UP_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_OUT_PULL_UP(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_OUT_PULL_DOWN_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_OUT_PULL_DOWN(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_IN_ANALOG_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_IN_ANALOG(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_MIDDLE_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_MIDDLE(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_LOW_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_LOW(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_HIGH_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_HIGH(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_0_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_0(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_1_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_1(mGpio,mPin);
}
YZF_RESULT yzf_gpio_lock_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_lock(mGpio,mPin);
}
YZF_RESULT yzf_gpio_unlock_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_unlock(mGpio,mPin);
}
YZF_BOOL yzf_gpio_get_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_get(mGpio,mPin);
}